#include <time.h>
#include <limits.h>
#include <stdlib.h>
#include "data.h"

/* Número de pontos calculados por iteração */
#define NUM_POINTS 30000000

/* Quantidade de threads */
#define NUM_THREADS 2

/* Número máximo de iterações */
#define MAX_ITER 20

typedef struct
{
    int i;      		/* Iteração atual */
	int conv;   		/* Flag que indica convergência */
    mpz_t total;    	/* Total de pontos */
    mpz_t in;			/* Estrutura para cada thread nas iterações */
    mpf_t pi;    		/* Pi */
} m_carlo;     			/* Parâmetros do algoritmo de Monte Carlo concorrente */

/* Gera um número aleatório entre o intervalo de [0, RAND_MAX] */
unsigned long long rand_number();

/* Verifica se um ponto está dentro de 1/4 da circunferência */
int in_circle();

/* Cálculo de pontos dentro de uma circunferência */
unsigned int points_in_circle();

/* Calcula pi */
void calc_pi_mc(mpf_t pi, mpz_t in, mpz_t total);

/* Algoritmo sequencial de Monte Carlo */
void monte_carlo(mpf_t pi, int *iter);

/* Inicializa a struct para os cálculos paralelos */
void start_struct_mc(m_carlo *aux);

/* Limpa a struct */
void clear_struct_mc(m_carlo *aux);

/* Função da thread para calcular números aleatórios e fazer a contagem de m */
void *thread_calc_points_mc(void *arg);

/* Função da thread que calcula o Pi e verifica convergência */
void thread_calc_pi_mc(m_carlo *aux);

/* Algoritmo paralelo de Monte Carlo */
void monte_carlo_paral(mpf_t pi, int *iter);


